#include "stm32f10x.h" // Device header

#define PIN_A GPIO_Pin_15
#define PIN_B GPIO_Pin_14
#define PIN_C GPIO_Pin_13
#define PIN_D GPIO_Pin_12
#define PIN_E GPIO_Pin_11
#define PIN_F GPIO_Pin_10
#define PIN_G GPIO_Pin_9
#define PIN_H GPIO_Pin_8

#define NUM_1 GPIO_Pin_7
#define NUM_2 GPIO_Pin_6
#define NUM_3 GPIO_Pin_5
#define NUM_4 GPIO_Pin_4

/**
 * 函    数：LED初始化
 * 参    数：无
 * 返 回 值：无
 */
void LED_Init(void)
{
	/*开启时钟*/
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); // 开启GPIOB的时钟

	/*GPIO初始化*/
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB, &GPIO_InitStructure); // 将PB4到PB15引脚初始化为推挽输出

	/*设置GPIO初始化后的默认电平*/
	GPIO_ResetBits(GPIOB, GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15); // 设置PB4到PB15引脚为低电平

	/*开启时钟*/
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // 开启GPIOB的时钟

	/*GPIO初始化*/
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure); // 将PA4到PA15引脚初始化为推挽输出

	/*设置GPIO初始化后的默认电平*/
	GPIO_ResetBits(GPIOA, GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15); // 设置PB4到PB15引脚为低电平
}

/**
 * 函    数：LED显示数字
 * 参    数：无
 * 返 回 值：无
 */
void LED_ShowNumber(GPIO_TypeDef *GPIO_Group, uint8_t number)
{
	// 将对应的引脚置高清屏
	GPIO_SetBits(GPIO_Group, PIN_A | PIN_B | PIN_C | PIN_D | PIN_E | PIN_F | PIN_G | PIN_H);
	// 根据数字选择对应的引脚置低，显示对应的数字
	switch (number)
	{
	case 0:
		GPIO_ResetBits(GPIO_Group, PIN_A | PIN_B | PIN_C | PIN_D | PIN_E | PIN_F);
		break;
	case 1:
		GPIO_ResetBits(GPIO_Group, PIN_B | PIN_C);
		break;
	case 2:
		GPIO_ResetBits(GPIO_Group, PIN_A | PIN_B | PIN_D | PIN_E | PIN_G);
		break;
	case 3:
		GPIO_ResetBits(GPIO_Group, PIN_A | PIN_B | PIN_C | PIN_D | PIN_G);
		break;
	case 4:
		GPIO_ResetBits(GPIO_Group, PIN_B | PIN_C | PIN_F | PIN_G);
		break;
	case 5:
		GPIO_ResetBits(GPIO_Group, PIN_A | PIN_C | PIN_D | PIN_F | PIN_G);
		break;
	case 6:
		GPIO_ResetBits(GPIO_Group, PIN_A | PIN_C | PIN_D | PIN_E | PIN_F | PIN_G);
		break;
	case 7:
		GPIO_ResetBits(GPIO_Group, PIN_A | PIN_B | PIN_C);
		break;
	case 8:
		GPIO_ResetBits(GPIO_Group, PIN_A | PIN_B | PIN_C | PIN_D | PIN_E | PIN_F | PIN_G);
		break;
	case 9:
		GPIO_ResetBits(GPIO_Group, PIN_A | PIN_B | PIN_C | PIN_D | PIN_F | PIN_G);
		break;
	default:
		GPIO_ResetBits(GPIO_Group, PIN_A | PIN_D | PIN_E | PIN_F | PIN_G);
		break;
	}
	// 关闭所有引脚
	// GPIO_SetBits(GPIO_Group, PIN_A | PIN_B | PIN_C | PIN_D | PIN_E | PIN_F | PIN_G | PIN_H);
}

void LED_Show(GPIO_TypeDef *GPIO_Group, uint16_t number)
{
	// 数据预处理
	//  number1 %= 100;
	//  number2 %= 100;

	// 选择对应的数码管
	GPIO_SetBits(GPIO_Group, NUM_1);		   // 选择第一个数码管
	LED_ShowNumber(GPIO_Group, number / 1000); // 千位数字
	Delay_us(5 + 5);						   // 保持显示一段时间
	GPIO_ResetBits(GPIO_Group, NUM_1);		   // 取消选择第一个数码管
	number %= 1000;

	GPIO_SetBits(GPIO_Group, NUM_2);		  // 选择第二个数码管
	LED_ShowNumber(GPIO_Group, number / 100); // 显示百位数字
	Delay_us(5 + 5);						  // 保持显示一段时间
	GPIO_ResetBits(GPIO_Group, NUM_2);		  // 取消选择第二个数码管
	number %= 100;

	GPIO_SetBits(GPIO_Group, NUM_3);		 // 选择第三个数码管
	LED_ShowNumber(GPIO_Group, number / 10); // 十位数字
	if (GPIO_Group == GPIOA)
		GPIO_ResetBits(GPIO_Group, PIN_H); // 取消选择第一个数码管
	Delay_us(5 + 5);					   // 保持显示一段时间
	GPIO_ResetBits(GPIO_Group, NUM_3);	   // 取消选择第一个数码管
	number %= 10;

	GPIO_SetBits(GPIO_Group, NUM_4);	// 选择第四个数码管
	LED_ShowNumber(GPIO_Group, number); // 显示个位数字
	Delay_us(5 + 5);					// 保持显示一段时间
	GPIO_ResetBits(GPIO_Group, NUM_4);	// 取消选择第二个数码管
}
/**
 * 函    数：LED1关闭
 * 参    数：无
 * 返 回 值：无
 */
